package team2.game.crow;

import org.anddev.andengine.entity.sprite.Sprite;
import org.anddev.andengine.opengl.texture.region.TextureRegion;

public class Laser extends Sprite {
	
	// ===========================================================
    // Constants
    // ===========================================================
	
	// ===========================================================
    // Fields
    // ===========================================================
    
	private boolean active;
	private float waveWidth;
	private int speed;
	private int mode;//0: Normal, 1:Sine Wave, 2: Cosine Wave
	private double angle;
	private float mid;
	private int direction;
	
	// ===========================================================
    // Constructors
    // ===========================================================

	Laser(float x, float y, final TextureRegion mLaser) {
		super(x, y, mLaser);
		active = true;
		speed = 250;
		mode = 0;
		angle = 0;
		waveWidth = 50;
		direction = 1;
	}
	
    // ===========================================================
    // Getter & Setter
    // ===========================================================
	
	public void activate(){
		active = true;
	}
	
	public void deactivate(){
		active = false;
	}
	
	public void setMode(int m){
		mode = m;
	}
	
	public void setAngle(double a){
		angle = a;
	}
	public float getAngleRads(){
		return (float) angle;
	}
	public float getAngleDegs(){
		return (float) Math.toDegrees(angle);
	}
	public void setMid(float m){
		mid = m;
	}
	
	public void setDirection(int dir){
		direction = dir;
	}
	
	public void setSpeed(int s){
		speed = s;
	}
	
    // ===========================================================
    // Methods for/from SuperClass/Interfaces
    // ===========================================================
	
	@Override
	protected void onManagedUpdate(float pSecondsElapsed){
		//Debug.d("PreMove: "+this.mY);
		if(active){
			this.move(pSecondsElapsed);
		}
		//Debug.d("PostMove: "+this.mY);
		super.onManagedUpdate(pSecondsElapsed);
	}
	
	// ===========================================================
    // Methods
    // ===========================================================
	
	private void move(float delta){
		double x;
		switch(mode){
			case 0://Normal
				x = delta*speed*Math.sin(angle);
				this.setPosition((float)x+this.mX, this.mY - speed*delta*Math.abs((float)Math.cos(angle))*direction);
				break;
			case 1://Sine wave
				x = waveWidth*Math.sin(this.mY/5);
				this.setPosition((float)x+mid, this.mY - speed*delta);
				break;
			case 2://Cosine Wave
				x = -waveWidth*Math.sin(this.mY/5);
				this.setPosition((float)x+mid, this.mY - speed*delta);
				break;
		}
	}
	
	// ===========================================================
    // Inner and Anonymous Classes
    // ===========================================================

}
